<?php defined('SYSPATH') OR die('No direct access allowed.');
/**
 * utf8::strtoupper
 * @package    Core
 * @author     Kohana Team
 * @copyright  (c) 2007 Kohana Team
 * @copyright  (c) 2005 Harry Fuecks
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt
 */
function _strtoupper($str){
	if(SERVER_UTF8)
		return mb_strtoupper($str);

	if(utf8::is_ascii($str))
		return strtoupper($str);

	static $UTF8_LOWER_TO_UPPER = NULL;

	if($UTF8_LOWER_TO_UPPER === NULL){
		$UTF8_LOWER_TO_UPPER = array(
			0x0061=> 0x0041, 0x03C6=> 0x03A6, 0x0163=> 0x0162, 0x00E5=> 0x00C5, 0x0062=> 0x0042,
			0x013A=> 0x0139, 0x00E1=> 0x00C1, 0x0142=> 0x0141, 0x03CD=> 0x038E, 0x0101=> 0x0100,
			0x0491=> 0x0490, 0x03B4=> 0x0394, 0x015B=> 0x015A, 0x0064=> 0x0044, 0x03B3=> 0x0393,
			0x00F4=> 0x00D4, 0x044A=> 0x042A, 0x0439=> 0x0419, 0x0113=> 0x0112, 0x043C=> 0x041C,
			0x015F=> 0x015E, 0x0144=> 0x0143, 0x00EE=> 0x00CE, 0x045E=> 0x040E, 0x044F=> 0x042F,
			0x03BA=> 0x039A, 0x0155=> 0x0154, 0x0069=> 0x0049, 0x0073=> 0x0053, 0x1E1F=> 0x1E1E,
			0x0135=> 0x0134, 0x0447=> 0x0427, 0x03C0=> 0x03A0, 0x0438=> 0x0418, 0x00F3=> 0x00D3,
			0x0440=> 0x0420, 0x0454=> 0x0404, 0x0435=> 0x0415, 0x0449=> 0x0429, 0x014B=> 0x014A,
			0x0431=> 0x0411, 0x0459=> 0x0409, 0x1E03=> 0x1E02, 0x00F6=> 0x00D6, 0x00F9=> 0x00D9,
			0x006E=> 0x004E, 0x0451=> 0x0401, 0x03C4=> 0x03A4, 0x0443=> 0x0423, 0x015D=> 0x015C,
			0x0453=> 0x0403, 0x03C8=> 0x03A8, 0x0159=> 0x0158, 0x0067=> 0x0047, 0x00E4=> 0x00C4,
			0x03AC=> 0x0386, 0x03AE=> 0x0389, 0x0167=> 0x0166, 0x03BE=> 0x039E, 0x0165=> 0x0164,
			0x0117=> 0x0116, 0x0109=> 0x0108, 0x0076=> 0x0056, 0x00FE=> 0x00DE, 0x0157=> 0x0156,
			0x00FA=> 0x00DA, 0x1E61=> 0x1E60, 0x1E83=> 0x1E82, 0x00E2=> 0x00C2, 0x0119=> 0x0118,
			0x0146=> 0x0145, 0x0070=> 0x0050, 0x0151=> 0x0150, 0x044E=> 0x042E, 0x0129=> 0x0128,
			0x03C7=> 0x03A7, 0x013E=> 0x013D, 0x0442=> 0x0422, 0x007A=> 0x005A, 0x0448=> 0x0428,
			0x03C1=> 0x03A1, 0x1E81=> 0x1E80, 0x016D=> 0x016C, 0x00F5=> 0x00D5, 0x0075=> 0x0055,
			0x0177=> 0x0176, 0x00FC=> 0x00DC, 0x1E57=> 0x1E56, 0x03C3=> 0x03A3, 0x043A=> 0x041A,
			0x006D=> 0x004D, 0x016B=> 0x016A, 0x0171=> 0x0170, 0x0444=> 0x0424, 0x00EC=> 0x00CC,
			0x0169=> 0x0168, 0x03BF=> 0x039F, 0x006B=> 0x004B, 0x00F2=> 0x00D2, 0x00E0=> 0x00C0,
			0x0434=> 0x0414, 0x03C9=> 0x03A9, 0x1E6B=> 0x1E6A, 0x00E3=> 0x00C3, 0x044D=> 0x042D,
			0x0436=> 0x0416, 0x01A1=> 0x01A0, 0x010D=> 0x010C, 0x011D=> 0x011C, 0x00F0=> 0x00D0,
			0x013C=> 0x013B, 0x045F=> 0x040F, 0x045A=> 0x040A, 0x00E8=> 0x00C8, 0x03C5=> 0x03A5,
			0x0066=> 0x0046, 0x00FD=> 0x00DD, 0x0063=> 0x0043, 0x021B=> 0x021A, 0x00EA=> 0x00CA,
			0x03B9=> 0x0399, 0x017A=> 0x0179, 0x00EF=> 0x00CF, 0x01B0=> 0x01AF, 0x0065=> 0x0045,
			0x03BB=> 0x039B, 0x03B8=> 0x0398, 0x03BC=> 0x039C, 0x045C=> 0x040C, 0x043F=> 0x041F,
			0x1EF3=> 0x1EF2, 0x0068=> 0x0048,
			0x00EB=> 0x00CB, 0x0111=> 0x0110, 0x0433=> 0x0413, 0x012F=> 0x012E, 0x00E6=> 0x00C6,
			0x0078=> 0x0058, 0x0161=> 0x0160, 0x016F=> 0x016E, 0x03B1=> 0x0391, 0x0457=> 0x0407,
			0x0173=> 0x0172, 0x00FF=> 0x0178, 0x006F=> 0x004F, 0x043B=> 0x041B, 0x03B5=> 0x0395,
			0x0445=> 0x0425, 0x0121=> 0x0120, 0x017E=> 0x017D, 0x017C=> 0x017B, 0x03B6=> 0x0396,
			0x03B2=> 0x0392, 0x03AD=> 0x0388, 0x1E85=> 0x1E84, 0x0175=> 0x0174, 0x0071=> 0x0051,
			0x0437=> 0x0417, 0x1E0B=> 0x1E0A, 0x0148=> 0x0147, 0x0105=> 0x0104, 0x0458=> 0x0408,
			0x014D=> 0x014C, 0x00ED=> 0x00CD, 0x0079=> 0x0059, 0x010B=> 0x010A, 0x03CE=> 0x038F,
			0x0072=> 0x0052, 0x0430=> 0x0410, 0x0455=> 0x0405, 0x0452=> 0x0402, 0x0127=> 0x0126,
			0x0137=> 0x0136, 0x012B=> 0x012A, 0x03AF=> 0x038A, 0x044B=> 0x042B, 0x006C=> 0x004C,
			0x03B7=> 0x0397, 0x0125=> 0x0124, 0x0219=> 0x0218, 0x00FB=> 0x00DB, 0x011F=> 0x011E,
			0x043E=> 0x041E, 0x1E41=> 0x1E40, 0x03BD=> 0x039D, 0x0107=> 0x0106, 0x03CB=> 0x03AB,
			0x00E7=> 0x00C7, 0x03CA=> 0x03AA, 0x0441=> 0x0421,
			0x0432=> 0x0412, 0x010F=> 0x010E, 0x00F8=> 0x00D8, 0x0077=> 0x0057, 0x011B=> 0x011A,
			0x0074=> 0x0054, 0x006A=> 0x004A, 0x045B=> 0x040B, 0x0456=> 0x0406, 0x0103=> 0x0102,
			0x00F1=> 0x00D1, 0x043D=> 0x041D, 0x03CC=> 0x038C, 0x00E9=> 0x00C9,
			0x0123=> 0x0122,
		);
	}

	$uni = utf8::to_unicode($str);

	if($uni === FALSE)
		return FALSE;

	for($i = 0, $c = count($uni); $i < $c; $i++){
		if(isset($UTF8_LOWER_TO_UPPER[$uni[$i]])){
			$uni[$i] = $UTF8_LOWER_TO_UPPER[$uni[$i]];
		}
	}

	return utf8::from_unicode($uni);
}